Skip to content

Conversation

@maranicolae
Copy link
Owner

Laborator 10

Exercitiul 1

Dorim sa afisam IP-ul si portul pentru pachetele ce au ca sursa host-ul. Pentru a captura pachetele este nevoie sa atasam un hook. L-am inregistrat in init-ul modulului folosind dupa cum este sugerat init_net (network namespace), dezalocarea se face in functia de exit a modulului. Dupa aceea am initializat structura nf_hook_ops si am definit functia de hook, my_nf_hookfn.

In implementarea functiei my_nf_hookfn am utilizat utilizat bufferul pachetului (skb) pentru a identifica headerele de IP si TCP determinand din acestea adresa IP si portul.

Pentru testare observam output-ul:

IP address is 127.0.0.1
Port number is 41608
IP address is 127.0.0.1
Port number is 60000
IP address is 127.0.0.1
Port number is 41608
IP address is 127.0.0.1
Port number is 41608
IP address is 127.0.0.1
Port number is 60000
IP address is 127.0.0.1
Port number is 41608
IP address is 127.0.0.1
Port number is 60000
IP address is 127.0.0.1
Port number is 41608

Exercitiul 2

In functia ioctl preluam din userspace adresa IP destinatie si marcam citirea prin marcarea variabilei atomice ioctl_set. Am completat functia test_daddr verificand ca a fost primita adresa din userspace (flag-ul e setat); apoi am verificat egalitatea dintre adresa primita din userspace si cea curenta din header-ul IP. De asemenea, am modificat functia my_nf_hookfn.

Observam rezultatele obtinute:

IP address is 127.0.0.1
Port number is 48526
Should show up in filter.
Should NOT show up in filter.
Check dmesg output.

Exercitiul 3

Am creat un socket TCP folosind sock_create_kern. Socket-ul va "asculta" pe portul 60000 fiind initializat folosind operatiile bind si listen. M-am ghidat dupa net/socket.c.

Observam corectitudinea din output-ul scriptului de test:

root@qemux86:~/skels/networking/3-4-tcp-sock# ./test-3.sh | grep 6000
+ insmod tcp_sock.ko
+ netstat -tuan
tcp        0      0 127.0.0.1:60000         0.0.0.0:*               LISTEN
+ rmmod tcp_sock

Exercitiul 4

Am creat un nou socket (lite) pentru a asigura conexiune externa pe care o va accepta. In cazul in care apelul accept va returna -EAGAIN, atunci se va reincerca apelul de accept. Folosind getname, vom prelua socketul destinatie si vom printa portul si adresa acesuia.

Exercitiul 5

Am creat un socket pentru protocolul UDP si l-am initializat prin apelul bind. Pentru a trimite mesajul am completat functia my_udp_msgsend si am atribuit structurii iovec (user space data) buffer-ul cu mesajul si dimensiunea acestuia, in apelul kernel_sendmsg i-am facut un cast la kvec (kernel space data).

Output-ul generat de scriptul de testare:

root@qemux86:~/skels/networking/5-udp-sock# ./test-5.sh
+ pid=330
+ ../netcat -l -u -p 60001
+ sleep 1
+ insmod udp_sock.ko
+ rmmod udp_sock
+ kill 330

Signed-off-by: Mara-Ioana Nicolae <maraioana9967@gmail.com>
Signed-off-by: Mara-Ioana Nicolae <maraioana9967@gmail.com>
Signed-off-by: Mara-Ioana Nicolae <maraioana9967@gmail.com>
Signed-off-by: Mara-Ioana Nicolae <maraioana9967@gmail.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant